using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

		public PessoaenderecoVO getPessoaendereco(int? idPessoaEndereco)
		{
			PessoaenderecoVO pessoaenderecoVO = null;
			List<PessoaenderecoVO> listPessoaenderecoVOs = getPessoaenderecos(idPessoaEndereco, null, null, null, null, null, null);
			if (listPessoaenderecoVOs != null && listPessoaenderecoVOs.Count > 0)
			{
				pessoaenderecoVO = listPessoaenderecoVOs[0];
			}
			return pessoaenderecoVO;
		}

		public List<PessoaenderecoVO> getPessoaenderecos()
		{
			return getPessoaenderecos(null, null, null, null, null, null, null);
		}

		public List<PessoaenderecoVO> getPessoaenderecos(int? idPessoaEndereco)
		{
			return getPessoaenderecos(idPessoaEndereco, null, null, null, null, null, null);
		}

		public List<PessoaenderecoVO> getPessoaenderecos(int? idPessoaEndereco, int? idPessoa, int? idEnderecoTipo, int? idLogradouroTipo, int? idLogradouro, int? idBairro, int? idCidade)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT pse.idPessoaEndereco as pse_idPessoaEndereco, pse.idPessoa as pse_idPessoa, pes.pessoa as pes_pessoa, pse.idEnderecoTipo as pse_idEnderecoTipo, ent.enderecoTipo as ent_enderecoTipo, pse.idLogradouroTipo as pse_idLogradouroTipo, logr.logradouro as logr_logradouro, pse.idLogradouro as pse_idLogradouro, logr2.logradouro as logr2_logradouro, pse.logradouro as pse_logradouro, pse.numero as pse_numero, pse.complemento as pse_complemento, pse.cEP as pse_cEP, pse.idBairro as pse_idBairro, pse.idCidade as pse_idCidade, cid.cidade as cid_cidade, pse.bairro as pse_bairro, pse.cadastro as pse_cadastro, pse.cadastradoPor as pse_cadastradoPor, pse.edicao as pse_edicao, pse.editadoPor as pse_editadoPor  ");
			query.AppendLine("FROM pessoaendereco as pse LEFT OUTER JOIN pessoa as pes on pse.idPessoa=pes.idPessoa  LEFT OUTER JOIN enderecotipo as ent on pse.idEnderecoTipo=ent.idEnderecoTipo  LEFT OUTER JOIN logradouro as logr on pse.idLogradouroTipo=logr.idLogradouro  LEFT OUTER JOIN logradouro as logr2 on pse.idLogradouro=logr2.idLogradouro  LEFT OUTER JOIN bairro as bai on pse.idBairro=bai.idBairro  LEFT OUTER JOIN cidade as cid on pse.idCidade=cid.idCidade  ");
			if (idPessoaEndereco != null)
			{
				query.AppendLine(where + "pse.idPessoaEndereco=@idPessoaEndereco ");
				where = "AND ";
			}
			if (idPessoa != null)
			{
				query.AppendLine(where + "pse.idPessoa=@idPessoa ");
				where = "AND ";
			}
			if (idEnderecoTipo != null)
			{
				query.AppendLine(where + "pse.idEnderecoTipo=@idEnderecoTipo ");
				where = "AND ";
			}
			if (idLogradouroTipo != null)
			{
				query.AppendLine(where + "pse.idLogradouroTipo=@idLogradouroTipo ");
				where = "AND ";
			}
			if (idLogradouro != null)
			{
				query.AppendLine(where + "pse.idLogradouro=@idLogradouro ");
				where = "AND ";
			}
			if (idBairro != null)
			{
				query.AppendLine(where + "pse.idBairro=@idBairro ");
				where = "AND ";
			}
			if (idCidade != null)
			{
				query.AppendLine(where + "pse.idCidade=@idCidade ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY pse.idPessoaEndereco ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idPessoaEndereco!= null) cmd.Parameters.Add(getParameter(cmd, "@idPessoaEndereco", idPessoaEndereco));
			if (idPessoa!= null) cmd.Parameters.Add(getParameter(cmd, "@idPessoa", idPessoa));
			if (idEnderecoTipo!= null) cmd.Parameters.Add(getParameter(cmd, "@idEnderecoTipo", idEnderecoTipo));
			if (idLogradouroTipo!= null) cmd.Parameters.Add(getParameter(cmd, "@idLogradouroTipo", idLogradouroTipo));
			if (idLogradouro!= null) cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", idLogradouro));
			if (idBairro!= null) cmd.Parameters.Add(getParameter(cmd, "@idBairro", idBairro));
			if (idCidade!= null) cmd.Parameters.Add(getParameter(cmd, "@idCidade", idCidade));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<PessoaenderecoVO> listPessoaendereco = new List<PessoaenderecoVO>();

				while (reader.Read())
				{
					PessoaenderecoVO pessoaenderecoVO = PessoaenderecoVO.CreateVO();
					pessoaenderecoVO.idPessoaEndereco = reader.GetInt32(reader.GetOrdinal("pse_idPessoaEndereco"));
					pessoaenderecoVO.idPessoa = reader.GetInt32(reader.GetOrdinal("pse_idPessoa"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_pessoa")))
						pessoaenderecoVO.idPessoaVO.pessoa = reader.GetString(reader.GetOrdinal("pes_pessoa"));
					pessoaenderecoVO.idEnderecoTipo = reader.GetInt32(reader.GetOrdinal("pse_idEnderecoTipo"));
					if (!reader.IsDBNull(reader.GetOrdinal("ent_enderecoTipo")))
						pessoaenderecoVO.idEnderecoTipoVO.enderecoTipo = reader.GetString(reader.GetOrdinal("ent_enderecoTipo"));
					if (!reader.IsDBNull(reader.GetOrdinal("pse_idLogradouroTipo")))
						pessoaenderecoVO.idLogradouroTipo = reader.GetInt32(reader.GetOrdinal("pse_idLogradouroTipo"));
					if (!reader.IsDBNull(reader.GetOrdinal("logr_logradouro")))
						pessoaenderecoVO.idLogradouroTipoVO.logradouro = reader.GetString(reader.GetOrdinal("logr_logradouro"));
					if (!reader.IsDBNull(reader.GetOrdinal("pse_idLogradouro")))
						pessoaenderecoVO.idLogradouro = reader.GetInt32(reader.GetOrdinal("pse_idLogradouro"));
					if (!reader.IsDBNull(reader.GetOrdinal("logr2_logradouro")))
						pessoaenderecoVO.idLogradouroVO.logradouro = reader.GetString(reader.GetOrdinal("logr2_logradouro"));
					if (!reader.IsDBNull(reader.GetOrdinal("pse_logradouro")))
						pessoaenderecoVO.logradouro = reader.GetString(reader.GetOrdinal("pse_logradouro"));
					if (!reader.IsDBNull(reader.GetOrdinal("pse_numero")))
						pessoaenderecoVO.numero = reader.GetString(reader.GetOrdinal("pse_numero"));
					if (!reader.IsDBNull(reader.GetOrdinal("pse_complemento")))
						pessoaenderecoVO.complemento = reader.GetString(reader.GetOrdinal("pse_complemento"));
					if (!reader.IsDBNull(reader.GetOrdinal("pse_cEP")))
						pessoaenderecoVO.cEP = reader.GetString(reader.GetOrdinal("pse_cEP"));
					if (!reader.IsDBNull(reader.GetOrdinal("pse_idBairro")))
						pessoaenderecoVO.idBairro = reader.GetInt32(reader.GetOrdinal("pse_idBairro"));
					if (!reader.IsDBNull(reader.GetOrdinal("pse_idCidade")))
						pessoaenderecoVO.idCidade = reader.GetInt32(reader.GetOrdinal("pse_idCidade"));
					if (!reader.IsDBNull(reader.GetOrdinal("cid_cidade")))
						pessoaenderecoVO.idCidadeVO.cidade = reader.GetString(reader.GetOrdinal("cid_cidade"));
					if (!reader.IsDBNull(reader.GetOrdinal("pse_bairro")))
						pessoaenderecoVO.bairro = reader.GetString(reader.GetOrdinal("pse_bairro"));
					pessoaenderecoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("pse_cadastro"));
					pessoaenderecoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("pse_cadastradoPor"));
					pessoaenderecoVO.edicao = reader.GetDateTime(reader.GetOrdinal("pse_edicao"));
					pessoaenderecoVO.editadoPor = reader.GetString(reader.GetOrdinal("pse_editadoPor"));


					listPessoaendereco.Add(pessoaenderecoVO);
				}
				reader.Close();
				return listPessoaendereco;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setPessoaendereco(PessoaenderecoVO pessoaenderecoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE pessoaendereco ");
			query.AppendLine("SET idPessoa=@idPessoa, idEnderecoTipo=@idEnderecoTipo, idLogradouroTipo=@idLogradouroTipo, idLogradouro=@idLogradouro, logradouro=@logradouro, numero=@numero, complemento=@complemento, cEP=@cEP, idBairro=@idBairro, idCidade=@idCidade, bairro=@bairro,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idPessoaEndereco=@idPessoaEndereco ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPessoaEndereco", pessoaenderecoVO.idPessoaEndereco));
			cmd.Parameters.Add(getParameter(cmd, "@idPessoa", pessoaenderecoVO.idPessoa));
			cmd.Parameters.Add(getParameter(cmd, "@idEnderecoTipo", pessoaenderecoVO.idEnderecoTipo));
			if (pessoaenderecoVO.idLogradouroTipo == null)
				cmd.Parameters.Add(getParameter(cmd, "@idLogradouroTipo", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idLogradouroTipo", pessoaenderecoVO.idLogradouroTipo));
			if (pessoaenderecoVO.idLogradouro == null)
				cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", pessoaenderecoVO.idLogradouro));
			if (pessoaenderecoVO.logradouro == null)
				cmd.Parameters.Add(getParameter(cmd, "@logradouro", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@logradouro", pessoaenderecoVO.logradouro));
			if (pessoaenderecoVO.numero == null)
				cmd.Parameters.Add(getParameter(cmd, "@numero", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@numero", pessoaenderecoVO.numero));
			if (pessoaenderecoVO.complemento == null)
				cmd.Parameters.Add(getParameter(cmd, "@complemento", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@complemento", pessoaenderecoVO.complemento));
			if (pessoaenderecoVO.cEP == null)
				cmd.Parameters.Add(getParameter(cmd, "@cEP", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@cEP", pessoaenderecoVO.cEP));
			if (pessoaenderecoVO.idBairro == null)
				cmd.Parameters.Add(getParameter(cmd, "@idBairro", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idBairro", pessoaenderecoVO.idBairro));
			if (pessoaenderecoVO.idCidade == null)
				cmd.Parameters.Add(getParameter(cmd, "@idCidade", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idCidade", pessoaenderecoVO.idCidade));
			if (pessoaenderecoVO.bairro == null)
				cmd.Parameters.Add(getParameter(cmd, "@bairro", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@bairro", pessoaenderecoVO.bairro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", pessoaenderecoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", pessoaenderecoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", pessoaenderecoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", pessoaenderecoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newPessoaendereco(PessoaenderecoVO pessoaenderecoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO pessoaendereco ");
			query.AppendLine("  ( idPessoa, idEnderecoTipo, idLogradouroTipo, idLogradouro, logradouro, numero, complemento, cEP, idBairro, idCidade, bairro, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @idPessoa, @idEnderecoTipo, @idLogradouroTipo, @idLogradouro, @logradouro, @numero, @complemento, @cEP, @idBairro, @idCidade, @bairro, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPessoa", pessoaenderecoVO.idPessoa));
			cmd.Parameters.Add(getParameter(cmd, "@idEnderecoTipo", pessoaenderecoVO.idEnderecoTipo));
			if (pessoaenderecoVO.idLogradouroTipo == null)
				cmd.Parameters.Add(getParameter(cmd, "@idLogradouroTipo", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idLogradouroTipo", pessoaenderecoVO.idLogradouroTipo));
			if (pessoaenderecoVO.idLogradouro == null)
				cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idLogradouro", pessoaenderecoVO.idLogradouro));
			if (pessoaenderecoVO.logradouro == null)
				cmd.Parameters.Add(getParameter(cmd, "@logradouro", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@logradouro", pessoaenderecoVO.logradouro));
			if (pessoaenderecoVO.numero == null)
				cmd.Parameters.Add(getParameter(cmd, "@numero", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@numero", pessoaenderecoVO.numero));
			if (pessoaenderecoVO.complemento == null)
				cmd.Parameters.Add(getParameter(cmd, "@complemento", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@complemento", pessoaenderecoVO.complemento));
			if (pessoaenderecoVO.cEP == null)
				cmd.Parameters.Add(getParameter(cmd, "@cEP", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@cEP", pessoaenderecoVO.cEP));
			if (pessoaenderecoVO.idBairro == null)
				cmd.Parameters.Add(getParameter(cmd, "@idBairro", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idBairro", pessoaenderecoVO.idBairro));
			if (pessoaenderecoVO.idCidade == null)
				cmd.Parameters.Add(getParameter(cmd, "@idCidade", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idCidade", pessoaenderecoVO.idCidade));
			if (pessoaenderecoVO.bairro == null)
				cmd.Parameters.Add(getParameter(cmd, "@bairro", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@bairro", pessoaenderecoVO.bairro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", pessoaenderecoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", pessoaenderecoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", pessoaenderecoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", pessoaenderecoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('pessoaendereco') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delPessoaendereco(PessoaenderecoVO pessoaenderecoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM pessoaendereco ");
			query.AppendLine("WHERE idPessoaEndereco=@idPessoaEndereco ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPessoaEndereco", pessoaenderecoVO.idPessoaEndereco));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountPessoaenderecoxIdPessoa(int? idPessoa)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idPessoa) as ocorrencias FROM pessoaendereco WHERE IdPessoa=@IdPessoa ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdPessoa", idPessoa));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountPessoaenderecoxIdEnderecoTipo(int? idEnderecoTipo)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idEnderecoTipo) as ocorrencias FROM pessoaendereco WHERE IdEnderecoTipo=@IdEnderecoTipo ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdEnderecoTipo", idEnderecoTipo));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountPessoaenderecoxIdLogradouroTipo(int? idLogradouroTipo)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idLogradouroTipo) as ocorrencias FROM pessoaendereco WHERE IdLogradouroTipo=@IdLogradouroTipo ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdLogradouroTipo", idLogradouroTipo));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountPessoaenderecoxIdLogradouro(int? idLogradouro)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idLogradouro) as ocorrencias FROM pessoaendereco WHERE IdLogradouro=@IdLogradouro ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdLogradouro", idLogradouro));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountPessoaenderecoxIdBairro(int? idBairro)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idBairro) as ocorrencias FROM pessoaendereco WHERE IdBairro=@IdBairro ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdBairro", idBairro));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountPessoaenderecoxIdCidade(int? idCidade)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idCidade) as ocorrencias FROM pessoaendereco WHERE IdCidade=@IdCidade ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdCidade", idCidade));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
